feat: talk skill + teach the voice in learn#7
Conversation
Add a first-party `.claude/skills/talk/` skill that renders a sentence (`harmonics say`) or explicit axes (`harmonics play`) to a WAV and plays it through a system player (pw-play/paplay/aplay/ffplay/afplay). This is the reliable "hear it" path: it needs no live-audio backend, so the agent's non-speech voice is audible even without the optional `harmonics-cli[audio]` extra that `--play` requires (a dev checkout omits it on purpose, to keep the no-backend test path clean). Teach it in `harmonics learn` so any agent can pick it up: the command map now lists play/say/demo, a "Talking out loud" section covers the two pathways + dry-run/--wav/--play, and a step-by-step "Build a talk skill" recipe (mirrored in the structured JSON `voice`/`talk_skill` keys) shows how to wrap the voice. Record `talk` as first-party in `docs/skill-sources.md` so a guildmaster re-sync never clobbers it. Rubric gate (`teken cli doctor . --strict`), 2357 tests, and all four lint gates pass. Version bumped 0.7.0 -> 0.8.0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
/agentic_review |
PR Summary by QodoAdd first-party talk skill and teach harmonics voice workflow in
AI Description
Diagram
High-Level Assessment
Files changed (6)
|
Code Review by Qodo
1. talk.sh plays audio by default
|
talk.sh: - reject conflicting output flags (--play/--wav/--out/--midi) that would break the wrapper's render-then-play pipeline; direct users to --keep (Qodo #3545273922: --play took precedence over --wav → play on missing file) - add --dry-run/--notes-only (print the note sequence, skip render+play) so the dry-run path is explicit; play-on-invoke stays the deliberate "talk out loud" default (Qodo #3545273916) - validate --intent is present in --axes mode (harmonics play requires it), with a friendly example (Qodo #3545273930) - make the stdout contract match the header: echo the WAV path to stdout only when it persists (--keep or no-player fallback) (Qodo #3545273936) learn.py: - merge the implicitly concatenated string literals into one (SonarCloud python:S5799 at learn.py:119) uv.lock: sync editable harmonics-cli 0.7.0 -> 0.8.0 to match pyproject. Gates: 2357 tests, black/isort/flake8/bandit, shellcheck, teken cli doctor . --strict all pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|



What
Give agents a way to talk in harmonics' non-speech voice, and teach it in
learnso any agent can pick it up..claude/skills/talk/—scripts/talk.shrenders a sentence (harmonics say) or explicit axes (harmonics play) to a WAV and plays it through the first available system player (pw-play/paplay/aplay/ffplay/afplay). It prints the dry-run note sequence, then sounds it. This is the reliable "hear it" path: it needs no live-audio backend, so the voice is audible even without the optionalharmonics-cli[audio]extra that--playrequires (a dev checkout omits that extra on purpose, to keep the no-backend test path clean).harmonics learnnow teaches the voice — the command map listsplay/say/demo(previously stale), a new "Talking out loud" section covers the two pathways plus dry-run /--wav/--play, and a step-by-step "Build a talk skill" recipe shows how to wrap the voice. The structured JSON payload gainsvoiceandtalk_skillkeys mirroring the same content, so machine consumers learn it too.docs/skill-sources.mdrecordstalkas a first-party (non-vendored) skill so a guildmaster re-sync never overwrites or removes it.Why
say/playalready existed but nothing taught agents to use them out loud, andlearn's command map didn't even mention them. This closes that gap and makes "talk to me" a first-class, reproducible capability.Testing
uv run pytest -n auto→ 2357 passedteken cli doctor . --strict(afi rubric gate) → PASS (all markers present;learnstill ≥200 chars and names purpose / command map / exit codes /--json/explain)black --check,isort --check-only,flake8,bandit→ cleanmarkdownlint-cli2on changed markdown,shellcheckontalk.sh→ cleantalk.shthrough PipeWireAlignment note
Touches
.claude/skills/(adds thetalkskill) — the addition is first-party and recorded in the provenance ledger; no vendored skill is modified, so a re-sync is unaffected.Version: 0.7.0 → 0.8.0 (minor — new capability).